#pragma once
#include <memory>
#include <glm/glm.hpp>

struct MeshBasicMaterial {
    MeshBasicMaterial(const glm::vec3 &color_ = glm::vec3(1.0f), float opacity_ = 1.0f)
        : color(color_), opacity(opacity_) {}
    const void *valuePtr() const { return &color; }

    glm::vec3 color{1.0f, 1.0f, 1.0f};
    float opacity = 1.0f;
};

struct MeshPhongMaterial {
    MeshPhongMaterial(const MeshPhongMaterial &material)
        : diffuse(material.diffuse), specular(material.specular), shininess(material.shininess) {}
    MeshPhongMaterial(const glm::vec3 &diffuse_ = glm::vec3(0.8f), const glm::vec3 &specular_ = glm::vec3(1.0f),
                      float shininess_ = 32.0f)
        : diffuse(diffuse_), specular(specular_), shininess(shininess_) {}
    const void *valuePtr() const { return &diffuse; }

    alignas(16) glm::vec3 diffuse{0.8f, 0.8f, 0.8f};
    alignas(16) glm::vec3 specular{1.0f, 1.0f, 1.0f};
    float shininess{32.0f};
};